ОбменомБ.отд
Главная     ◄Глагол     ◄Азбука     ◄Задачи на Глаголе     Примеры приложений ►   Среда разработки ►   Отладка программ ►   Отличия от Оберона ►   Отличия от Паскаля ►   Ассемблер ARM ►   Глагол для ARM ►   ? и Ответы
 
 glagol.png Программируем по-русски
 

Основная задача Глагола — дать человеку возможность воплощать свои мысли на языке, близком к его родному языку.

Издатель Глагола
 

 

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
                              ОТДЕЛ ОбменомБ;
(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
(* НАЗНАЧЕНИЕ: упорядочивание ряда быстрым обменом ("быстрая сортировка")     *)
(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)

(*────────────────────────────────────────────────────────────────────────────*)
ЗАДАЧА Упорядочить-(ряд+:РЯД ИЗ ЦЕЛ);
(* Цель:  упорядочивание с помощью разделения на участки (Ч.Хоар)
 * До:    <ряд> - исходный ряд
 * После: <ряд> - упорядоченный ряд *)
ПЕР
  Л,П:ЦЕЛ;     (* текущий участок                   *)
  л,п:ЦЕЛ;     (* новый участок                     *)
  граница:ЦЕЛ; (* граничное значение для разделения *)
  рядл:ЦЕЛ;    (* промежуточное значение для обмена *)
  глубина:ЦЕЛ; (* текущая глубина стека             *)
  стек:РЯД 32 ИЗ НАБОР Л,П:ЦЕЛ КОН; (* стек для новых участков *)
УКАЗ
  глубина:=0; 
  стек[0].Л:=0; 
  стек[0].П:=РАЗМЕР(ряд)-1;
  ПОВТОРЯТЬ
    (* выбор из стека последнего запроса *)
    Л:=стек[глубина].Л; 
    П:=стек[глубина].П;
    УМЕНЬШИТЬ(глубина);
    ПОВТОРЯТЬ
      (* разделение ряд[Л]...ряд[П] *)
      л:=Л; п:=П;
      граница:=ряд[(Л+П) ДЕЛИТЬ 2];
      ПОВТОРЯТЬ
        ПОКА ряд[л] > граница ВЫП УВЕЛИЧИТЬ(л) КОН;
        ПОКА граница > ряд[п] ВЫП УМЕНЬШИТЬ(п) КОН;
        ЕСЛИ л <= п ТО (* обмен местами ряд[л] с ряд[п] *)
          рядл:=ряд[л];
          ряд[л]:=ряд[п];
          ряд[п]:=рядл;
          УВЕЛИЧИТЬ(л);
          УМЕНЬШИТЬ(п)
        КОН
      ДО л > п;
      ЕСЛИ п-Л < П-л ТО
        ЕСЛИ л < П ТО (* запись в стек запроса на упорядочивание правой части *)
          УВЕЛИЧИТЬ(глубина);
          стек[глубина].Л:=л;
          стек[глубина].П:КОН;
        П:=п (* продолжение упорядочивания левой части *)
      ИНАЧЕ
        ЕСЛИ Л < п ТО (* запись в стек запроса на упорядочивание левой части *)
          УВЕЛИЧИТЬ(глубина);
          стек[глубина].Л:=Л;
          стек[глубина].П:=п
        КОН;
        Л:(* продолжение упорядочивания правой части *)
      КОН
    ДО Л >= П
  ДО глубина < 0
КОН Упорядочить;

КОН ОбменомБ.




Вопросы, замечания и предложения высылайте на atimopheyev@yahoo.com или Издателю Глагола:
 email
 
Главная     ◄Глагол     ◄Азбука     ◄Задачи на Глаголе     Примеры приложений ►   Среда разработки ►   Отладка программ ►   Отличия от Оберона ►   Отличия от Паскаля ►   Ассемблер ARM ►   Глагол для ARM ►   ? и Ответы